package com.sybil.ot.dominio;

import java.io.Serializable;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.validation.Valid;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Entity
@Table(name = "SIL_PASOS_FLUJO")
public class Paso implements Serializable {

   private static final long serialVersionUID = 1L;
   protected PasoPK llave;
   private String descripcion;
   private String descripcionCorta;
   private String enviaAviso;
   private String tipoPaso;
   private double montoAprobacion;
   private String finalCorrecto;
   private String usuarioCreo;
   private String usuarioModif;
   private Flujo flujo;
   private List<Evento> eventos;
   private List<ResponsablePaso> responsablesPaso;

   public Paso() {
   }

   public Paso(PasoPK llave) {
      this.llave = llave;
   }

   public Paso(String claveFlujo, String clavePaso) {
      this.llave = new PasoPK(claveFlujo, clavePaso);
   }

   public Paso(PasoPK llave, String descripcion, String enviaAviso, String tipoPaso,
           String finalCorrecto) {
      this.llave = llave;
      this.descripcion = descripcion;
      this.enviaAviso = enviaAviso;
      this.tipoPaso = tipoPaso;
      this.finalCorrecto = finalCorrecto;
   }

   @EmbeddedId
   @Valid
   public PasoPK getLlave() {
      return llave;
   }

   public void setLlave(PasoPK llave) {
      this.llave = llave;
   }

   @Basic(optional = false)
   @NotNull
   @Size(min = 1, max = 100, message = "La Descripción debe tener entre 1 y 100 caracteres")
   @Column(name = "PAFL_DESCRIPCION")
   public String getDescripcion() {
      return descripcion;
   }

   public void setDescripcion(String descripcion) {
      this.descripcion = descripcion;
   }

   @Size(max = 15, message = "La longitud máxima son 15 caracteres")
   @Column(name = "PAFL_DESC_CORTA")
   public String getDescripcionCorta() {
      return descripcionCorta;
   }

   public void setDescripcionCorta(String descripcionCorta) {
      this.descripcionCorta = descripcionCorta;
   }

   @Basic(optional = false)
   @NotNull
   @Size(min = 1, max = 1)
   @Column(name = "PAFL_AVISO")
   public String getEnviaAviso() {
      return enviaAviso;
   }

   public void setEnviaAviso(String enviaAviso) {
      this.enviaAviso = enviaAviso;
   }

   @Basic(optional = false)
   @NotNull
   @Size(min = 1, max = 1)
   @Column(name = "PAFL_TIPO_PASO")
   public String getTipoPaso() {
      return tipoPaso;
   }

   public void setTipoPaso(String tipoPaso) {
      this.tipoPaso = tipoPaso;
   }

   @NotNull(message = "Especificar el monto, puede especificar cero si no valida el monto")
   @Min(value = 0, message = "Debe especificar un monto igual o mayor a cero.")
   @Column(name = "PAFL_MONTO_APROBACION")
   public double getMontoAprobacion() {
      return montoAprobacion;
   }

   public void setMontoAprobacion(double montoAprobacion) {
      this.montoAprobacion = montoAprobacion;
   }

   @Basic(optional = false)
   @NotNull
   @Size(min = 1, max = 1)
   @Column(name = "PAFL_FINAL_CORRECTO")
   public String getFinalCorrecto() {
      return finalCorrecto;
   }

   public void setFinalCorrecto(String finalCorrecto) {
      this.finalCorrecto = finalCorrecto;
   }

   @Basic(optional = false)
   @Column(name = "PAFL_USUARIO_CREO")
   public String getUsuarioCreo() {
      return usuarioCreo;
   }

   public void setUsuarioCreo(String usuarioCreo) {
      this.usuarioCreo = usuarioCreo;
   }

   @Column(name = "PAFL_USUARIO_MODIF")
   public String getUsuarioModif() {
      return usuarioModif;
   }

   public void setUsuarioModif(String usuarioModif) {
      this.usuarioModif = usuarioModif;
   }

   @OneToMany(cascade = CascadeType.ALL, mappedBy = "paso")
   public List<Evento> getEventos() {
      return eventos;
   }

   public void setEventos(List<Evento> eventos) {
      this.eventos = eventos;
   }

   @JoinColumn(name = "PAFL_FLUJ_CLAVE", referencedColumnName = "FLUJ_CLAVE", insertable = false, updatable = false)
   @ManyToOne(optional = false, fetch = FetchType.EAGER)
   public Flujo getFlujo() {
      return flujo;
   }

   public void setFlujo(Flujo flujo) {
      this.flujo = flujo;
   }

   @OneToMany(cascade = CascadeType.ALL, mappedBy = "paso")
   public List<ResponsablePaso> getResponsablesPaso() {
      return responsablesPaso;
   }

   public void setResponsablesPaso(List<ResponsablePaso> responsablesPaso) {
      this.responsablesPaso = responsablesPaso;
   }

   @Override
   public int hashCode() {
      int hash = 0;
      hash += (llave != null ? llave.hashCode() : 0);
      return hash;
   }

   @Override
   public boolean equals(Object object) {
      if (!(object instanceof Paso)) {
         return false;
      }
      Paso other = (Paso) object;
      if ((this.llave == null && other.llave != null) || (this.llave != null && !this.llave.equals(other.llave))) {
         return false;
      }
      return true;
   }

   @Override
   public String toString() {
      return "Paso[ llave=" + llave + " ]";
   }
}
